package encheres.manager.impl;

import org.hibernate.HibernateException;
import org.omg.CORBA.ORB;

import encheres.dao.IClientDAO;
import encheres.dao.entities.Client;
import encheres.dao.impl.ClientDAOImpl;
import encheres.manager.SessionManager;
import encheres.manager.corba.I_ClientPOA;

/**
 * Implémente le skeleton de Categorie.
 * @author Nicolas
 *
 */
public class I_ClientImpl extends I_ClientPOA {
	
	/** service DAO pour gérer les objets Client avec la BD. */
	private IClientDAO clientDao = new ClientDAOImpl();
	/** bus par lequel les requêtes sur les objets transitent. */
	private ORB orb;

	/**
	 * Connecte le client au serveur en lui renvoyant un identifiant de session pour qu'il puisse effectuer des requêtes
	 * 
	 * @param login le login de l'utilisateur
	 * @param mdp le mot de passe de l'utilisateur
	 * @return identifiant de session >0 en cas de succès, 0 en cas de mauvais couple login/mdp, et -1 en cas d'autre erreur
	 */
	public int connexion(String login, String mdp) {
		Client client = null;
		try {
			client = clientDao.findClient(login, mdp);
		} catch (HibernateException e) {
			return -1;
		} 
		if (client == null) {
			return 0;
		}
		int sessionId = SessionManager.createSession(client.getIdClient());
		
		return sessionId;
	}

	/**
	 * Crée un compte utilisateur
	 * 
	 * @param login le login demandé
	 * @param mdp le mot de passe de l'utilisateur
	 * @param nom le nom complet de l'utilisateur
	 * @param adresse l'adresse postale de l'utilisateur
	 * @return 1 en cas de succès de création, 0 en cas de login déjà existant, et -1 en cas d'autre erreur
	 */
	public int creerCompte(String login, String mdp, String nom, String adresse) {

		//TODO : implémenter la création d'un utilisateur avec un login déjà existant.
		try {
			clientDao.creerClient(new Client(nom, adresse, login, mdp));
			return 1;
		} catch (HibernateException e) {
			if (e.getCause() != null) {
				return 0;
			} else {
				return -1;
			}
		}
	}

	/**
	 * Ferme le bus par lequel les requêtes sur les objets transitent.
	 */
	public void shutdown() {
		orb.shutdown(false);
	}
	
	/**
	 * setteur sur le bus par lequel les requêtes sur les objets transitent.
	 * @param orb_val le nouveau bus par lequel les requêtes sur les objets transitent.
	 */
	public void setORB(ORB orb_val) {
		orb = orb_val;
	}
}
